/**
 * 与推理模型进行交互的异步函数
 * @param {HTMLElement} endpointUrl - 包含端点 URL 的对象，从其 value 属性获取实际 URL
 *
 * @param {HTMLElement} endpointKey - 包含端点密钥的对象，从其 value 属性获取实际密钥
 *
 * @param {HTMLElement} modelName - 包含模型名称的对象，从其 value 属性获取实际模型名
 *
 * @param {Array} messages - 消息数组，包含对话历史和当前用户消息
 *
 * @param {Boolean} stream - 是否启用流式响应
 *
 * @param {Boolean} [toSignal=false] - 是否设置中止信号，默认为 false
 *
 * @param {Boolean} [enableThinking=false] - 是否启用思考，默认为 false
 *
 * @returns {Promise<Response>} 返回 fetch 请求的响应结果
 */
async function contactReasoningModel(endpointUrl, endpointKey, modelName, messages, stream, toSignal = false) {
    /**
     * 若推理模型为系统模型，则从服务器获取链接数据
     */
    const systemUrl = await convertUrl(endpointUrl.value);
    /**
     * 构建发给推理模型的请求体
     */
    const requestBody = {
        // 推理模型名称
        model: modelName.value,
        // 消息数组，包含对话历史和当前用户消息
        messages,
        // 是否启用流式响应
        stream
    };
    /**
     * 配置请求选项
     */
    const requestOption = {
        // 设置请求方法为 POST
        method: "POST",
        // 启用跨域请求
        crossDomain: true,
        // 设置请求头
        headers: {
            // 设置认证信息，从页面元素中获取推理端点密钥并进行编码
            "Authorization": "Bearer " + encodeURIComponent(endpointKey.value),
            // 设置请求体的内容类型为 JSON
            "Content-Type": "application/json",
        },
        // 将请求体数据转换为 JSON 字符串
        body: JSON.stringify(requestBody),
        // 是否启用流式响应
        stream: true
    };
    // 设置中止信号，用于后续可能的请求中止操作
    if (toSignal) requestOption.signal = abortController.signal;
    // 发送请求并返回响应
    return fetch(systemUrl + "/chat/completions", requestOption);
};

/**
 * 与嵌入模型进行交互的异步函数
 *
 * @param {HTMLElement} endpointUrl - 包含端点 URL 的对象，从其 value 属性获取实际 URL
 *
 * @param {HTMLElement} endpointKey - 包含端点密钥的对象，从其 value 属性获取实际密钥
 *
 * @param {HTMLElement} modelName - 包含模型名称的对象，从其 value 属性获取实际模型名
 *
 * @param {Array} messages - 待处理的输入文本
 *
 * @param {Boolean} stream - 是否启用流式响应
 *
 * @param {Boolean} [toSignal=false] - 是否设置中止信号，默认为 false
 *
 * @returns {Promise<Response>} 返回 fetch 请求的响应结果
 */
async function contactEmbeddingModel(endpointUrl, endpointKey, modelName, messages, stream = false, toSignal = false) {
    /**
     * 若嵌入模型为系统模型，则从服务器获取链接数据
     */
    const systemUrl = await convertUrl(endpointUrl.value);
    /**
     * 构建发给嵌入模型的请求体
     */
    const requestBody = {
        // 嵌入模型名称
        model: modelName.value,
        // 代处理的输入文本
        input: messages,
        // 是否启用流式响应
        stream
    };
    /**
     * 配置请求选项
     */
    const requestOption = {
        // 设置请求方法为 POST
        method: "POST",
        // 启用跨域请求
        crossDomain: true,
        // 设置请求头
        headers: {
            // 设置认证信息，从页面元素中获取推理端点密钥并进行编码
            "Authorization": "Bearer " + encodeURIComponent(endpointKey.value),
            // 设置请求体的内容类型为 JSON
            "Content-Type": "application/json",
        },
        // 将请求体数据转换为 JSON 字符串
        body: JSON.stringify(requestBody),
    };
    // 设置中止信号，用于后续可能的请求中止操作
    if (toSignal) requestOption.signal = abortController.signal;
    // 发送请求并返回响应
    return fetch(systemUrl + "/embeddings", requestOption);
};